package org.shoukaiseki.common.utils;

import org.shoukaiseki.common.exception.MessageVirtualException;

import java.math.BigDecimal;

import static org.shoukaiseki.common.utils.CostMathUtils.divideNullIsZero;
import static org.shoukaiseki.common.utils.CostMathUtils.multiplyNullIsZero;

/**
 * 用于平台抽取一定比率费用
 **/
public class ProportionUtils {


    /**
     * 平台扣除的管理费用金额
     * @param cost          订单金额
     * @param proportion        管理费比率,为数字,0-100
     * @return
     */
    public static BigDecimal platformDeductionCostReturnBigDecimal(Number cost, Integer proportion){
        BigDecimal lineCost=CostMathUtils.ifNullToZero(cost);
        BigDecimal l = toServiceProviderCostReturnBigDecimal(lineCost, proportion);
        BigDecimal l1 = CostMathUtils.subtractNullIsZero(lineCost,l);
        if(NumberUtils.isLessZero(l1)){
            throw new MessageVirtualException("平台收取的管理费不能为负数:{}").format(l1);
        }
        return l1;
    }

    /**
     * 平台扣除的管理费用金额
     * @param lineCost          订单金额
     * @param proportion        管理费比率,为数字,0-100
     * @return
     */
    public static long platformDeductionCostReturnLong(Long lineCost,Integer proportion){
        long l = toServiceProviderCostReturnLong(lineCost, proportion);
        long l1 = lineCost - l;
        if(l1<0){
           throw new MessageVirtualException("平台收取的管理费不能为负数:{}").format(l1);
        }
        return l1;
    }


    /**
     *  计算给服务提供方的金额
     * @param lineCost          订单金额
     * @param deductCost         平台管理抽取金额
     * @return
     */
    public static long toServiceProviderCostReturnLongByPlatformDeduction(Long lineCost,Long deductCost){
        long l = lineCost - deductCost;
        if(l<0){
            throw new RuntimeException("计算异常,结果为负数"+l);
        }
        return l;
    }

    /**
     *  计算给服务提供方的金额
     * @param lineCost          订单金额
     * @param deductCost         平台管理抽取金额
     * @return
     */
    public static BigDecimal toServiceProviderCostReturnBigDecimalByPlatformDeduction(BigDecimal lineCost,BigDecimal deductCost){
        BigDecimal l = CostMathUtils.subtractNullIsZero(lineCost, deductCost) ;
        if(NumberUtils.isLessZero(l)){
            throw new RuntimeException("计算异常,结果为负数"+l);
        }
        return l;
    }


    /**
     *  计算给服务提供方的金额
     * @param lineCost          订单金额
     * @param proportion        管理费比率,为数字,0-100
     * @return
     */
    public static long toServiceProviderCostReturnLong(Long lineCost,Integer proportion){
        if (proportion==null) {
            proportion=0;
        }
        if (lineCost==null) {
            lineCost=0L;
        }
        if(lineCost<0L){
            throw new MessageVirtualException("goldCoin不能为负数");
        }
        if(proportion>100||proportion<0){
            throw new MessageVirtualException("比率不能大于100%,且不能为负数");
        }
        BigDecimal b1 = multiplyNullIsZero(divideNullIsZero(100 - proportion, 100), lineCost);
        long l = b1.longValue();
        if (l<0) {
            throw new MessageVirtualException("计算后结果为负数:{}").format(l);
        }
        if(l>lineCost){
            l=l-1;
        }

        if(l>lineCost){
            throw new MessageVirtualException("计算异常,订单值:{},比率:{}计算后返回服务提供者:{}").format(lineCost,proportion,l);
        }

        return l;
    }

    /**
     *  计算给服务提供方的金额
     * @param cost          订单金额
     * @param proportion        管理费比率,为数字,0-100
     * @return
     */
    public static BigDecimal toServiceProviderCostReturnBigDecimal(Number cost, Integer proportion){
        BigDecimal lineCost=CostMathUtils.ifNullToZero(cost);
        if (proportion==null) {
            proportion=0;
        }
        if (lineCost==null) {
            lineCost=BigDecimal.ZERO;
        }
        if(NumberUtils.isLessZero(lineCost)){
            throw new MessageVirtualException("goldCoin不能为负数");
        }
        if(proportion>100||proportion<0){
            throw new MessageVirtualException("比率不能大于100%,且不能为负数");
        }
        BigDecimal l = multiplyNullIsZero(divideNullIsZero(100 - proportion, 100), lineCost);
        if (!NumberUtils.isGreaterZero(l)){
            throw new MessageVirtualException("计算后结果为负数:{}").format(l);
        }
        if (NumberUtils.isGreater(l,lineCost)) {
            l=CostMathUtils.subtractNullIsZero(l,BigDecimal.ONE);
        }

        if (NumberUtils.isGreater(l,lineCost)) {

            throw new MessageVirtualException("计算异常,订单值:{},比率:{}计算后返回服务提供者:{}").format(lineCost,proportion,l);
        }

        return l;
    }

}
